﻿namespace Lesson_5_值类型和引用类型
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("值类型和引用类型");

            #region 知识点一
            //把之前学过的数据类型分为值类型和引用类型
            //值类型：int、double、bool、char、enum、struct、decimal，其它，结构体（未学）
            //引用类型：string、object、class、interface、delegate，数组、集合类（未学）

            #endregion

            #region 知识点二 值类型和引用类型的区别
            //1.使用上的区别
            //值类型
            int a = 10;
            //引用类型
            int[] arr = new int[] { 1, 2, 3, 4, };
            //申明了一个b让其等于之前的a
            int b = a;
            //申明了一个arr2让其等于之前的arr
            int[] arr2 = arr;
            Console.WriteLine("a={0}, b={1}", a, b);
            Console.WriteLine("arr[0] = {0}, arr2[0] =]{1}", arr[0], arr2[0]);

            b = 20;
            arr2[0] = 5;
            Console.WriteLine("修改了b和arr2[0]之后");
            Console.WriteLine("a={0}, b={1}", a, b);
            Console.WriteLine("arr[0] = {0}, arr2[0] =]{1}", arr[0], arr2[0]);

            //值类型 在相互赋值是 把内容拷贝给了对方 它变我不变
            //引用类型的在相互赋值是 让两者指向同一个值 它变我也跟着变

            //2.为什么会有以上的区别？
            //值类型在内存中存储的是实际的值，而引用类型在内存中存储的是指向实际值的指针。
            //值类型在赋值时，会将值拷贝给另一个变量，因此两个变量互不影响。
            //引用类型在赋值时，会将指针拷贝给另一个变量，因此两个变量都指向同一个值。
            //值类型在内存中开辟一块新的空间，因此可以存储不同的值。
            //引用类型在内存中只开辟一块指针，因此只能存储同一个值。

            //new了一个新的arr2，所以arr2和之前的arr指向不同的地址
            arr2 = new int[] { 99, 1, 2, 3 };
            Console.WriteLine("arr[0] = {0], arr2[0] =]{1}", arr[0], arr2[0]);
            #endregion
        }
    }
}
